home *** CD-ROM | disk | FTP | other *** search
- #! /usr/bin/env python
-
- # Minimal interface to the Internet telnet protocol.
- #
- # It refuses all telnet options and does not recognize any of the other
- # telnet commands, but can still be used to connect in line-by-line mode.
- # It's also useful to play with a number of other services,
- # like time, finger, smtp and even ftp.
- #
- # Usage: telnet host [port]
- #
- # The port may be a service name or a decimal port number;
- # it defaults to 'telnet'.
-
-
- import sys, posix, time
- from socket import *
-
- BUFSIZE = 1024
-
- # Telnet protocol characters
-
- IAC = chr(255) # Interpret as command
- DONT = chr(254)
- DO = chr(253)
- WONT = chr(252)
- WILL = chr(251)
-
- def main():
- host = sys.argv[1]
- try:
- hostaddr = gethostbyname(host)
- except error:
- sys.stderr.write(sys.argv[1] + ': bad host name\n')
- sys.exit(2)
- #
- if len(sys.argv) > 2:
- servname = sys.argv[2]
- else:
- servname = 'telnet'
- #
- if '0' <= servname[:1] <= '9':
- port = eval(servname)
- else:
- try:
- port = getservbyname(servname, 'tcp')
- except error:
- sys.stderr.write(servname + ': bad tcp service name\n')
- sys.exit(2)
- #
- s = socket(AF_INET, SOCK_STREAM)
- #
- try:
- s.connect(host, port)
- except error, msg:
- sys.stderr.write('connect failed: ' + `msg` + '\n')
- sys.exit(1)
- #
- pid = posix.fork()
- #
- if pid == 0:
- # child -- read stdin, write socket
- while 1:
- line = sys.stdin.readline()
- s.send(line)
- else:
- # parent -- read socket, write stdout
- iac = 0 # Interpret next char as command
- opt = '' # Interpret next char as option
- while 1:
- data = s.recv(BUFSIZE)
- if not data:
- # EOF; kill child and exit
- sys.stderr.write( '(Closed by remote host)\n')
- posix.kill(pid, 9)
- sys.exit(1)
- cleandata = ''
- for c in data:
- if opt:
- print ord(c)
- s.send(opt + c)
- opt = ''
- elif iac:
- iac = 0
- if c == IAC:
- cleandata = cleandata + c
- elif c in (DO, DONT):
- if c == DO: print '(DO)',
- else: print '(DONT)',
- opt = IAC + WONT
- elif c in (WILL, WONT):
- if c == WILL: print '(WILL)',
- else: print '(WONT)',
- opt = IAC + DONT
- else:
- print '(command)', ord(c)
- elif c == IAC:
- iac = 1
- print '(IAC)',
- else:
- cleandata = cleandata + c
- sys.stdout.write(cleandata)
- sys.stdout.flush()
-
-
- try:
- main()
- except KeyboardInterrupt:
- pass
-